package InterfacesAndModules;

import DependenciesInterface.TimeModule;
import FlightInfo.FlightStatus;
import FlightInfo.Flights;
import NewAirportInfo.AirportBasicInfo;
import NewAirportInfo.AirportRunwayInfo;
import UserInterface.UserInputIsSure;

import java.util.ArrayList;
import java.util.Scanner;

public class PilotInterface {
    public void FlightPlainFillModule(ArrayList<AirportBasicInfo>AirportInfo, ArrayList<Flights>AllOfFlight,ArrayList<FlightStatus>AllOfFlightStatus){
        /*先声明一下临时变量*/
        DataOperationInterface Doi = new DataOperationInterface();
        String InFlightNumbers, InFlightArrival;
        int InFlightParkingAirporn;
        String PilotIsSure;//飞行员是否同意
        AirportBasicInfo ABI = Doi.GetAirportBasicInfo(AirportInfo,0);
        Flights Temp;
        FlightStatus TempStatus;
        /*开始正文*/
        System.out.println("亲爱的飞行员，您好，欢迎使用本系统");
        System.out.println("请输入您的飞行计划，先输入您的航班号");
        Scanner PilotInputer = new Scanner(System.in);
        InFlightNumbers = PilotInputer.nextLine();
        if (InFlightNumbers.isEmpty()) {
            System.out.println("您未输入航班号，请问您是否要输入");
            System.out.println("不输入回车即退出");
            InFlightNumbers = PilotInputer.nextLine();
            if (InFlightNumbers.isEmpty()) {
                return;
            }
        }
        System.out.println("您这趟航班的目的地,请输入四字ICAO，必须全大写");
        InFlightArrival = PilotInputer.nextLine();
        if (InFlightArrival.isEmpty()) {
            System.out.println("您未输入您的目的地，请问您是否要输入");
            System.out.println("不输入回车即退出");
            InFlightArrival = PilotInputer.nextLine();
            if (InFlightArrival.isEmpty()) {
                return;
            }
        }
        /*针对进港*/
        if (InFlightArrival.equals(ABI.ThisAirportICAO)) {
            System.out.println("您是否有预选机位，有的话输入数字，没有的话输入0");
            InFlightParkingAirporn = PilotInputer.nextInt();
            if (InFlightParkingAirporn == 0) {
                System.out.println("没有的话，等稍后地面管制员给您分配机位，或者是给地面管制员说一下您后面预选机位");
            }
            System.out.println("好的，您进港信息如下所示");
            System.out.println("航班ID " + ABI.NumOfAirportFlight + 1 + " 航班号 " + InFlightNumbers);
            System.out.println("预计到达机场与预选机位");
            System.out.println(ABI.ThisAirportICAO + InFlightParkingAirporn);
            System.out.println("请核实您的进港信息");
            System.out.println("确认输入Y，需要修改输入N");
            PilotIsSure = PilotInputer.nextLine();
            UserInputIsSure IsSure = new UserInputIsSure();
            int isSure = IsSure.YNIsSure(PilotIsSure);
            if (isSure == 0) {
                System.out.println("开始写入计划信息到机场数据库");
                ABI.NumOfAirportFlight++;
                Temp = new Flights(InFlightNumbers,InFlightArrival);
                Temp.InFlightParkingAirporn = InFlightParkingAirporn;
                Temp.InFlightStatus = 2;
                TempStatus = new FlightStatus(ABI.NumOfAirportFlight,7);
                AllOfFlight.add(Temp);
                AllOfFlightStatus.add(TempStatus);
                System.out.println("飞行计划填写完毕，即将返回上一层");
                return;
            }else if (isSure == 1) {
                System.out.println("您已取消飞行计划输入");
            }
        }
        else {
            System.out.println("好的，您离港信息如下所示");
            System.out.println("航班ID " + (ABI.NumOfAirportFlight + 1) + " 航班号 " + InFlightNumbers);
            System.out.println("请核实您的离港信息");
            System.out.println("确认输入Y，需要修改输入N");
            PilotIsSure = PilotInputer.nextLine();
            UserInputIsSure IsSure = new UserInputIsSure();
            int isSure = IsSure.YNIsSure(PilotIsSure);
            if (isSure == 0) {
                System.out.println("开始写入计划信息到机场数据库");
                ABI.NumOfAirportFlight++;
                Temp = new Flights(InFlightNumbers,InFlightArrival);
                Temp.InFlightStatus = 1;
                TempStatus = new FlightStatus(ABI.NumOfAirportFlight, 0);
                AllOfFlight.add(Temp);
                AllOfFlightStatus.add(TempStatus);
                System.out.println("飞行计划填写完毕，即将返回上一层");
                return;
            }else if (isSure == 1) {
                System.out.println("您已取消飞行计划输入");
            }
        }
        return;
    }
    /*飞行计划模块填写完毕*/

    /*然后就是飞行员模块的重头大戏，查询模块，我觉得应该是整个飞行员模块最难的东西*/
    /*基于被管制代码提供信息*/
    public void FightInfoModule(ArrayList<AirportBasicInfo>AirportInfo,ArrayList<Flights>FlightsInfo, ArrayList<FlightStatus>AllFlightStatus , int FlightID) {
        DataOperationInterface Doi = new DataOperationInterface();
        AirportBasicInfo ABI = Doi.GetAirportBasicInfo(AirportInfo,0);
        FlightStatus ThisFlightStatus;
        Flights ThisFlight;
        if (FlightsInfo.size() < FlightID) {
            System.out.println("未查询到此航班ID，请核实后再查询");
            return;
        }
        ThisFlight = Doi.GetFlightData(FlightsInfo,FlightID);
        ThisFlightStatus = Doi.GetFlightStatusData(AllFlightStatus,FlightID);
        /*先列出本航班的基础信息*/
        System.out.println("查询结果");
        System.out.println("航班号：" + ThisFlight.FlightNumbers + " 航班统一标识码：" + FlightID);
        System.out.println("目的地机场：" + ThisFlight.InFlightArrival);
        /*开始判断*/
        if (ThisFlightStatus.InFlightControllerStatus == 0) {
            /*还在地面等待，呆着吧您嘞*/
            System.out.println("您还未联系放行，请在TOBT之前联系放行管制");
            System.out.println("放行席位频率：" + ABI.CELFreq);
            return;
        } else if (ThisFlightStatus.InFlightControllerStatus == 1) {
            System.out.println("您当前频率在：" + ABI.CELFreq + "  本机场的放行席位");
            System.out.println("您已被放行至 " + ThisFlight.InFlightArrival);
            System.out.println("预计使用跑道" + ThisFlight.DepUsingRwy + " 预计使用离场程序：" + ThisFlight.UsingSID);
            System.out.println("管制员还未让您转交地面管制，请耐心等待放行管制员的指示");
            return;
        } else if (ThisFlightStatus.InFlightControllerStatus == 2) {
            System.out.println("您当前频率在：" + ABI.GNDFreq + " 本机场的地面席位");
            System.out.println("您在" + ThisFlightStatus.LastHandoffTime + " 被移交至此席位");
            if (ThisFlightStatus.FlightPushbankStartTime.isEmpty()) {
                System.out.println("地面席位还未让您开车，请耐心等待，不如利用这些时间，去检查下飞行检查单");
                return;
            }
            System.out.println("地面席位已通知您机组可以开车，在 " + ThisFlightStatus.FlightPushbankStartTime + " 时通知完您机组");
            if (ThisFlightStatus.FlightPushbankOverTime.isEmpty()) {
                System.out.println("您还未开车完毕，请尽快准备好，以免耽误滑行道上的其他机组，若开车完毕，请尽快联系地面管制员");
                return;
            }
            System.out.println("您已在 " + ThisFlightStatus.FlightPushbankOverTime + " 时通知地面管制员您已开车完毕");
            if (ThisFlightStatus.IsApproveFlightTaxi) {
                System.out.println("地面管制员还未让您滑行，请耐心等待");
            }
            System.out.println("地面管制员已通知您滑行路径");
            System.out.println("滑行经由：" + ThisFlightStatus.FlightTaxiVia + "在跑道 " + ThisFlight.DepUsingRwy + " 外等");
        } else if (ThisFlightStatus.InFlightControllerStatus == 3) {
            System.out.println("您当前频率在 " + ABI.TWRFreq + " 本机场的塔台席位");
            System.out.println("您已在 " + ThisFlightStatus.LastHandoffTime + " 时被转交至本频率");
            System.out.println("您的滑行路径为：" + ThisFlightStatus.FlightTaxiVia + " 在跑道 " + ThisFlight.DepUsingRwy + " 外等");
            if (ThisFlightStatus.ISApprovedFlightTKF == 0) {
                System.out.println("塔台管制员还未给您起飞指令，请耐心等待");
                return;
            } else if (ThisFlightStatus.ISApprovedFlightTKF == 1) {
            System.out.println("塔台管制员已给您 <上跑道等待> 指令，请尽快上跑道 " + ThisFlight.DepUsingRwy + " 等待");
                return;
            } else if (ThisFlightStatus.ISApprovedFlightTKF == 2) {
                System.out.println("塔台管制员已经给您起飞指令，在 " + ThisFlightStatus.FlightTKFTime + " 时给您的许可，请尽快起飞，以免耽误后方可能的五边交通");
                return;
            }
            if (!ThisFlightStatus.FlightAirboneTime.isEmpty()) {
                System.out.println("请离地后尽快报告塔台管制员您已离地");
                return;
            }
            System.out.println("您已在 " + ThisFlightStatus.FlightAirboneTime + " 时报告离地，请尽快上升到离地高度，一面出现不必要的事故");
            if (ABI.DEPFreq == 0) {
                System.out.println("本机场没有配备离场管制席位，请尽早联系进近管制 " + ABI.APRFreq);
            }
            System.out.println("请尽早联系离场管制 " + ABI.DEPFreq);
        } else if (ThisFlightStatus.InFlightControllerStatus == 4) {
            /*离场最头疼的一件事情，如果机场没有配备离场席位的话，需要按照航班状态来给予服务*/
            /*先针对进港，遵循管制“进场优先” 原则*/
            if (ThisFlight.InFlightStatus == 2) {
                System.out.println("当前频率 " + ABI.APRFreq + " 进近管制席位，您在 " + ThisFlightStatus.LastHandoffTime + "转交到此频率");
                System.out.println("您的进场数据");
                if (ThisFlightStatus.IsFlightViaSTAR) {
                    if (ThisFlightStatus.AprDirectTo.isEmpty()) {
                        /*一般来说，这种情况不会出现，不直飞，下高度，要么脑子有毛病，要么就是交通规避*/
                        System.out.println("管制员给出指令为只下高，不直飞航标点");
                        System.out.println("您已被取消高度限制，下降到" + ThisFlightStatus.NoViaStarRnavAlt + " 高度保持");
                        return;
                    }
                    System.out.println("管制员已给出指令，取消程序限制");
                    System.out.println("您已被取消程序进场，直飞航标点 " + ThisFlightStatus.AprDirectTo + " 下降到  " +ThisFlightStatus.NoViaStarRnavAlt + " 高度保持");
                    return;
                }
                System.out.println("使用进场程序 " + ThisFlight.UsingSTAR + " 使用进场程序高度下高");
            } else if (ThisFlight.InFlightStatus == 1) {
                System.out.println("当前频率 " + ABI.APRFreq + " 进近管制席位，您在 " + ThisFlightStatus.FlightAirboneTime + " 离地，在 " + ThisFlightStatus.LastHandoffTime + " 转交");
                System.out.println("您的离场数据");
                if (ThisFlightStatus.IsFlightViaSID) {
                    if (!ThisFlightStatus.DepDirectTo.isEmpty()) {
                        System.out.println("管制已让您直飞到航标点 " + ThisFlightStatus.DepDirectTo);
                    }
                    System.out.println("您已被取消高度限制在  " + ThisFlightStatus.NoViaSIDAltTime + " 时间，请爬升到巡航高度 " + ThisFlight.CRZAlt);
                } else if (!ThisFlightStatus.IsFlightViaSID) {
                    System.out.println("管制员已让您沿SID " + ThisFlight.UsingSID + " 上升到标准气压程序高度");
                }
                else if(!ThisFlightStatus.HandOffToCenterContorllerTime.isEmpty())
                {
                    System.out.println("进近管制员已让您联系中心管制，联系频率 " + ABI.CTRFreq + "GoodDay!");
                }
            }
        } else if (ThisFlightStatus.InFlightControllerStatus == 5) {
            System.out.println("当前频率 " + ABI.APRFreq + " 离场管制席位，您在 " + ThisFlightStatus.FlightAirboneTime + " 离地，在 " + ThisFlightStatus.LastHandoffTime + " 转交");
            System.out.println("您的离场数据");
            if (ThisFlightStatus.IsFlightViaSID) {
                if (!ThisFlightStatus.DepDirectTo.isEmpty()) {
                    System.out.println("管制已让您直飞到航标点 " + ThisFlightStatus.DepDirectTo);
                }
                System.out.println("您已被取消高度限制在  " + ThisFlightStatus.NoViaSIDAltTime + " 时间，请爬升到巡航高度 " + ThisFlight.CRZAlt);
            } else if (!ThisFlightStatus.IsFlightViaSID) {
                System.out.println("管制员已让您沿SID " + ThisFlight.UsingSID + " 上升到程序标准气压高度");
            }
            else if(!ThisFlightStatus.HandOffToCenterContorllerTime.isEmpty())
            {
                System.out.println("进近管制员已让您联系中心管制，联系频率 " + ABI.CTRFreq + "GoodDay!");
            }

        } else if (ThisFlightStatus.InFlightControllerStatus == 6) {
            System.out.println("管制员已将您移交到中心管制，请联系 " + ABI.CTRFreq + "Goodday!");
            System.out.println("感谢您使用此系统，希望您再次来临！");
        } else if (ThisFlightStatus.InFlightControllerStatus == -1) {
            System.out.println("很抱歉，您的航班已取消，看起来可以下班休息了");
        }else if (ThisFlightStatus.InFlightControllerStatus == 7) {
            System.out.println("您还未到达管制服务区域！请到达后联系管制使用此系统");
        }
    }

    public void PilotGetAirportInfoGet(ArrayList<AirportBasicInfo>Airport) {
        DataOperationInterface Doi =new DataOperationInterface();
        AirportBasicInfo ABI = Doi.GetAirportBasicInfo(Airport,0);
        System.out.println("欢迎使用机场信息查询系统");
        System.out.println("世界协调时间` " + TimeModule.GetUTCTime());
        System.out.println("机场名：" + ABI.ThisAirportName + " 机场ICAO：" + ABI.ThisAirportICAO);
        System.out.println("机场标高" + ABI.AirportAlt);
        System.out.println("机场METAR：" + ABI.AirprotMETAR);
        /*查询跑道开放信息*/
        System.out.println("跑道开放信息");
        for (int Counter = 0; Counter < ABI.Runways; Counter++) {
            AirportRunwayInfo RWYTemp = Doi.GetAirportRunwayInfo(ABI.RunwayList,Counter);
            /*创建计数器，用来查询跑道开放信息*/
            if (RWYTemp.IsRunwayOpen) {
                System.out.println("跑道ID " + Counter + " 跑道名 " + RWYTemp.RunwayName);
                System.out.println("跑道航向 " + RWYTemp.RunwayCRS);
                System.out.println("跑道ILS信息：ILS名称 " + RWYTemp.RunwayILSName + " 跑道ILS频率 " + RWYTemp.RunwayILSFreq + " 跑道ILS NAV声纹 " + RWYTemp.RunwayILSVoice);
                UsefulTools Tools = new UsefulTools();
                System.out.println("跑道ILS盲降等级 " + Tools.ILSCATInfo(RWYTemp.RunwayILS_CAT));
                System.out.println("*************************************************");
            } else if (!RWYTemp.IsRunwayOpen) {
                System.out.println("跑道ID" + Counter + " 跑道名 " + RWYTemp.RunwayName + "处于关闭状态，暂时无法提供跑道信息");
                System.out.println("*************************************************");
            }
        }
        System.out.println("建议报告管制员您已收到通播 " + ABI.AirportInfoRadioCode);
    }
}

/*
* 2024.11.6:该接口重构构完毕
*/
